<?php

namespace App\Http\Controllers\Web\Oauth;

use App\Services\Oauth\OauthorService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use App\Http\Controllers\Web\Oauth\Controller;
use App\Core\Utils\TwHelper\Environment;
use App\Core\Utils\Oauth\QqSdk\QqConnectAPI;
use App\Models\Oauth\UserModel;
use App\Models\Oauth\UserLoginOauthModel;
use Illuminate\Support\Facades\Cookie;
use App\Core\Utils\Oauth\WechatSdk\WechatConnect;
use App\Core\Utils\TwHelper\CommFunction;


/**
 * 第三方登陆授权类
 */
class AuthorController extends Controller
{

    /**
     * 第三方登陆统一入口
     */
    public function login(Request $request)
    {
        $type = $request->input('type');
        if ($type == 'qq') {
            $this->qqLogin();
        } elseif ($type == 'wechat') {
            $wechatCodeUrl = WechatConnect::getCodeUrl();
            //跳转到微信授权页面
            return redirect($wechatCodeUrl);
        } else {
            return redirect()->route('oauth.login');
        }
    }

    /**
     * QQ登录
     */
    public function qqLogin()
    {
        $qq = new QqConnectAPI();
        $qc = $qq->getQC();
        $qc->qq_login();
    }

    /**
     * qq登录的回调地址
     * 授权成功后，页面会跳转到这个地址
     * eg:http://wiki.open.qq.com/wiki/website/%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_Server-side
     */
    public function qqCallback(Request $request)
    {
        $qq = new QqConnectAPI();
        //QC类，api外部对象，调用接口全部依赖于此对象(无参数)
        $qc = $qq->getQC();
        //根据返回的授权码(code)获取access_token
        //获取到的access_token具有3个月有效期，用户再次登录时自动刷新。
        //第三方网站可存储access token信息，以便后续调用OpenAPI访问和修改用户信息时使用。
        $access_token = $qc->qq_callback();
        //使用Access Token来获取用户的OpenID
        $openId = $qc->get_openid();
        //使用Access Token和OpenID获取QC类，访问用户的信息
        $nqc = $qq->QC($access_token, $openId);
        //获取用户信息
        $userInfo = $nqc->get_user_info();
        $type = UserLoginOauthModel::TYPE_QQ;
        $oauthorService = new OauthorService();
        $loginOauth = $oauthorService->getLoginOauth($type, $openId, '');
        if ($loginOauth) {
            //该qq已经注册过帐号
            $user = UserModel::getUserById($loginOauth['user_id']);
            //该帐号已经绑定了手机号，直接登录
            $oauthorService->setlogin($user);
            //跳转到登录前的页面--用户中心


        } else {
            //该qq未注册过帐号，跳转到帐号绑定选择界面(绑定新帐号|绑定已有帐号)
            //将QQ授权返回的opend_id和type保存到cookie中
            $oauthorOpenInfo = ['type' => UserLoginOauthModel::TYPE_QQ, 'opendId' => $openId];
            Cookie::queue($oauthorService->getOautherOpenIdKey(), $oauthorOpenInfo, 5);


            if (Environment::isMobile()) {
                //跳转到手机注册页面
                return view('oauth-mobile.bound-oauth');
            }
            return view('oauth.bound-oauth');
        }
    }

    /**
     * 微信回调地址
     * 相关文档：https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316518&lang=zh_CN
     */
    public function wechatCallback(Request $request)
    {
        $code = $request->input('code');
        $state = $request->input('state');
        //该参数可用于防止csrf攻击（跨站请求伪造攻击），建议第三方带上该参数，可设置为简单的随机数加session进行校验
        $sessionState = session()->get(WechatConnect::getOauthStateSessionKey());
        session()->forget(WechatConnect::getOauthStateSessionKey());
        if ($state == $sessionState) {
            if ($code) {
                $acessTokenUrl = WechatConnect::getAcessTokenUrl($code);
                //获取access_token 有效期（目前为2个小时)
                $result = CommFunction::getCurl($acessTokenUrl);
                if($result && !isset($result['errcode'])){
                    $accessToken = $result['access_token'];
                    $userInfo = CommFunction::getCurl(WechatConnect::getAcessTokenUrl());
                    if($userInfo && !isset($userInfo['errcode'])){
                        $openId = $userInfo['openid'];
                        $type = UserLoginOauthModel::TYPE_WEIXIN;
                        $oauthorService = new OauthorService();
                        $loginOauth = $oauthorService->getLoginOauth($type, $openId, '');
                        if ($loginOauth) {
                            //该微信已经注册过帐号
                            $user = UserModel::getUserById($loginOauth['user_id']);
                            //该帐号已经绑定了手机号，直接登录
                            $oauthorService->setlogin($user);
                            //跳转到登录前的页面--用户中心



                        } else {
                            //该微信未注册过帐号，跳转到帐号绑定选择界面(绑定新帐号|绑定已有帐号)
                            //将微信授权返回的opend_id和type保存到cookie中
                            $oauthorOpenInfo = ['type' => UserLoginOauthModel::TYPE_WEIXIN, 'opendId' => $openId];
                            Cookie::queue($oauthorService->getOautherOpenIdKey(), $oauthorOpenInfo, 5);
                            if (Environment::isWeixin()) {
                                //跳转到手机注册页面
                                return view('oauth-mobile.bound-oauth');
                            }
                            return view('oauth.bound-oauth');
                        }
                    }
                }
            } else {
                echo "<h2>可能是服务器无法请求http协议</h2>可能未开启curl支持,请尝试开启curl支持，重启web服务器，如果问题仍未解决，请联系我们";
            }

        } else {
            echo "<h2>The state does not match. You may be a victim of CSRF.</h2>";
        }

    }

}